lexer grammar kavai_scaner;
options
{
	language = CSharp2;
}
@lexer::namespace  { Generated }
    
SEMICOLON
	:	';'+
	;

LEFT_BRACE
	: 	'('
	;		
RIGHT_BRACE
	:	')'
	;
LEFT_BRACKET
	:	'{'
	;
RIGHT_BRACKET
	:	'}'
	;
INCREMENT
	:	'++'
	;
DECREMENT
	:	'--'
	;
SUMM	:	'+'
	;
SUBSTACTION
	:	'-'
	;
DIVISION:	'/'
	;
MULTIPLICATION
	:	'*'
	;
ASSIGN_SUMM
	:	'+='
	;
ASSIGN_DIV
	:	'/='
	;
ASSIGN_MULT
	:	'*='
	;
ASSIGN_SUB
	:	'-='
	;
LESS	:	'<'
	;
LESS_EQUAL
	:	'<='
	;
MORE	:	'>'
	;
MORE_EQUAL
	:	'>='
	;
EQUAL	:	'=='
	;
ASSIGN	:	'='
	;
NOT_EQUAL
	:	'!='
	;
DENIAL	:	'!'
	;
ABSTRACT:	'abstract'
	;	
DO	:	'do'
	;
IN	:	'in'
	;
PROTECTED
	:	'protected'
	;	
TRUE	:	'true'
	;
AS	:	'as'
	;
DOUBLE	:	'double'
	;
PUBLIC	:	'public'
	;
TRY	:	'try'
	;
BASE	:	'base'
	;
ELSE	:	'else'
	;
INTERFACE
	:	'interface'
	;	
READONLY:	'readonly'
	;	
TYPEOF	:	'typeof'
	;
BOOL	:	'bool'
	;
ENUM	:	'enum'
	;
INTERNAL:	'internal'
	;	
REF	:	'ref'
	;
UINT	:	'uint'
	;
INT	:	'int'
	;
BREAK	:	'break'
	;
EVENT	:	'event'
	;
IS	:	'is'
	;
RETURN	:	'return'
	;
ULONG	:	'ulong'
	;
EXPLICIT:	'explicit'
	;	
LOCK	:	'lock'
	;
SBYTE	:	'sbyte'
	;
BYTE	:	'byte'
	;
UNCHECKED
	:	'unchecked'
	;
CASE	:	'case'
	;
EXTERN	:	'extern'
	;
LONG	:	'long'
	;
SEALED	:	'sealed'
	;
UNSAFE	:	'unsafe'
	;
CATCH	:	'catch'
	;
FALSE	:	'false'
	;
NAMESPACE
	:	'namespace'
	;	
USHORT	:	'ushort'
	;
SHORT	:	'short'
	;
CHAR_KEYWORD
	:	'char'
	;
FINALLY	:	'finally'
	;
NEW	:	'new'
	;
SIZEOF	:	'sizeof'
	;
USING	:	'using'
	;
CHECKED	:	'checked'
	;
FIXED	:	'fixed'
	;
NULL	:	'null'
	;
STACKALLOC
	:	'stackalloc'
	;	
VIRTUAL	:	'virtual'
	;
CLASS	:	'class'
	;	
FLOAT	:	'float'
	;
OBJECT	:	'object'
	;	
STATIC	:	'static'
	;
VOID	:	'void'
	;
CONST	:	'const'
	;
OPERATOR:	'operator'
	;	
STRING_KEYWORD
	:	'string'
	;
VOLATILE:	'volatile'
	;
CONTINUE:	'continue'
	;	
FOREACH	:	'foreach'
	;
FOR	:	'for'
	;
OUT	:	'out'
	;
STRUCT	:	'struct'
	;
WHILE	:	'while'
	;
DECIMAL	:	'decimal'
	;	
GOTO	:	'goto'
	;
OVERRIDE:	'override'
	;	
SWITCH	:	'switch'
	;
DEFAULT	:	'default'
	;	
IF	:	'if'
	;
PARAMS	:	'params'
	;
THIS	:	'this'
	;
DELEGATE:	'delegate'
	;	
IMPLICIT:	'implicit'
	;	
PRIVATE	:	'private'
	;	
THROW	:	'throw'
	;	

ID  :	('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
    ;

DIGIT :	'0'..'9'+
    ;
COMMENT
    :   '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
    |   '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
    ;


STRING
    :  '"' ( ESC_SEQ | ~('\\'|'"') )* '"'
    ;

CHAR:  '\'' ( ESC_SEQ | ~('\''|'\\') ) '\''
    ;

fragment
HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;

fragment
ESC_SEQ
    :   '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
    |   UNICODE_ESC
    |   OCTAL_ESC
    ;

fragment
OCTAL_ESC
    :   '\\' ('0'..'3') ('0'..'7') ('0'..'7')
    |   '\\' ('0'..'7') ('0'..'7')
    |   '\\' ('0'..'7')
    ;

fragment
UNICODE_ESC
    :   '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT
    ;
